package com.dexter.year2023.charpter1_linkedlist.level2.topic2_5删除元素;

import com.dexter.year2023.charpter1_linkedlist.level1.Demo1.Node;

import static com.dexter.year2023.charpter1_linkedlist.level1.Demo1.initLinkedList;
import static com.dexter.year2023.charpter1_linkedlist.level1.Demo1.printLinkedList;

/**
 * LeetCode 203. 移除链表元素
 * 给你一个链表的头结点 head 和一个整数 val ，请你删除链表中所有满足 Node.val == val 的结点，并返回 新的头结点 。
 * <p>
 * 示例 1：
 * 输入：head = [1,2,6,3,4,5,6], val = 6
 * 输出：[1,2,3,4,5]
 * 示例 2：
 * 输入：head = [], val = 1
 * 输出：[]
 * 示例 3：
 * 输入：head = [7,7,7,7], val = 7
 * 输出：[]
 * <p>
 * 提示：
 * 列表中的结点数目在范围 [0, 104] 内
 * 1 <= Node.val <= 50
 * 0 <= val <= 50
 *
 * @author Dexter
 */
public class Demo1RemoveElements {
    public static void main(String[] args) {
        int[] a = {1, 2, 6, 3, 4, 5, 6};
        Node head = initLinkedList(a);
        int val = 6;

        // 本节方法，比较cur.next.val与val是否相等（注意：站在cur的位置上，方便删除操作）
        head = removeElements(head, val);
        printLinkedList(head);
    }

    private static Node removeElements(Node head, int val) {
        // 涉及头结点的删除，虚拟结点
        Node dummy = new Node(-1);
        dummy.next = head;
        // 定义cur去移动
        Node cur = dummy;
        while (cur != null && cur.next != null) {
            // 对比，触发删除条件
            if (cur.next.val == val) {
                cur.next = cur.next.next;
            }
            cur = cur.next;
        }
        return dummy.next;
    }
}
